package cn.highedu.coolshark.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 跨域配置类
 */
@Slf4j
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    public CorsConfig() {
        log.debug("创建配置类对象：CorsConfig");
    }
//    @Override
//    public void addCorsMappings(CorsRegistry registry) {
//        registry.addMapping("/**") // 所有请求路径
//                .allowedOriginPatterns("*") // 所有来源
//                .allowedHeaders("*") // 所有请求头
//                .allowedMethods("*") // 所有请求方式
//                .allowCredentials(true) // 允许凭证
//                .maxAge(3600); // 有效期
//    }
//
    /**
     * 跨域过滤器 这个过滤器是Spring MVC过滤器，不是Spring Security过滤器
     * 在Spring Security中配置的过滤器Debug列表中，没有这个过滤器！
     * Spring MVC 和 Spring Security 都可以配置跨域过滤器
     * - Spring MVC 配置跨域过滤器 FilterRegistrationBean<CorsFilter>
     * - Spring Security 配置跨域过滤器：http.cors(Customizer.withDefaults())+CorsFilter
     * @return 过滤器注册对象，会在Spring容器中注册一个过滤器
     */
    @Bean
    public FilterRegistrationBean<CorsFilter> filterRegistrationBean() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 允许凭证
        config.addAllowedOrigin("http://localhost:9528"); // 允许所有来源
        config.addAllowedHeader("*"); // 允许所有请求头
        config.addAllowedMethod("*"); // 允许所有请求方式
        source.registerCorsConfiguration("/**", config); // 所有请求路径
        FilterRegistrationBean<CorsFilter> bean =
                new FilterRegistrationBean<>(new CorsFilter(source)); // 注册过滤器
        bean.setOrder(-100); // 设置优先级
        return bean;
    }
}
